/* 
 * File:   UsersDBTest.cpp
 * Author: nahuel
 *
 * Created on Jun 5, 2013, 7:22:19 PM
 */

#include <stdlib.h>
#include <iostream>
#include "common_UsersDB.h"

/*
 * Simple C++ Test Suite
 */

// Definir un path valido localmente
#define     FILE_PATH       "/home/nahuel/AU/users.xml"

#define     USER_1_USERNAME     "roberto27"
#define     USER_2_USERNAME     "carl0s"
#define     USER_3_USERNAME     "miguel2265"

#define     USER_1_PSW          "22123gk"
#define     USER_2_PSW          "password9023"
#define     USER_3_PSW          "456asdmk123"

void testUsersDB() {
    std::string filePath(FILE_PATH);
    
    UsersDB usersDB(filePath);
    
    if (false /*check result*/) {
        std::cout << "%TEST_FAILED% time=0 testname=testUsersDB (UsersDBTest) message=error message sample" << std::endl;
    }
}

void testAgregarUsuario() {
    std::string usuario1(USER_1_USERNAME);
    std::string password1(USER_1_PSW);
    
    std::string usuario2(USER_2_USERNAME);
    std::string password2(USER_2_PSW);
    
    std::string usuario3(USER_3_USERNAME);
    std::string password3(USER_3_PSW);    
    
    UsersDB usersDB(std::string(FILE_PATH));
    
    usersDB.AgregarUsuario(usuario1, password1);
    usersDB.AgregarUsuario(usuario2, password2);
    usersDB.AgregarUsuario(usuario3, password3);
    
    if (false /*check result*/) {
        std::cout << "%TEST_FAILED% time=0 testname=testAgregarUsuario (UsersDBTest) message=error message sample" << std::endl;
    }
}

void testAutenticarUsuario() {
    std::string usuario1(USER_1_USERNAME);
    std::string password1(USER_1_PSW);
    
    std::string usuario2(USER_2_USERNAME);
    std::string password2(USER_2_PSW);
    
    std::string usuario3(USER_3_USERNAME);
    std::string password3(USER_3_PSW);
    
    UsersDB usersDB(std::string(FILE_PATH));    
    
    if (!( usersDB.AutenticarUsuario(usuario1, password1) &&
           usersDB.AutenticarUsuario(usuario2, password2) &&
           usersDB.AutenticarUsuario(usuario3, password3) )) {
        std::cout << "%TEST_FAILED% time=0 testname=testAutenticarUsuario (UsersDBTest) message=error message sample" << std::endl;
    }
    
    std::string nonRegisteredUser("ramon42");
    std::string nonRegisteredUserPsw("4a56s41q3");    
    
    if (usersDB.AutenticarUsuario(nonRegisteredUser, nonRegisteredUserPsw)) {
        std::cout << "%TEST_FAILED% time=0 testname=testAutenticarUsuario (UsersDBTest) message=error message sample" << std::endl;
    }
}

void testDeleteUsuario() {
    std::string usuario1(USER_1_USERNAME);    
    std::string usuario2(USER_2_USERNAME);   
    std::string usuario3(USER_3_USERNAME);   
    
    std::string nonRegisteredUser("ramon42");   
    
    UsersDB usersDB(std::string(FILE_PATH));

    if (usersDB.DeleteUsuario(nonRegisteredUser)) {
        std::cout << "%TEST_FAILED% time=0 testname=testAutenticarUsuario (UsersDBTest) message=error message sample" << std::endl;
    }    
    
    if (!( usersDB.DeleteUsuario(usuario1) &&
           usersDB.DeleteUsuario(usuario2) &&
           usersDB.DeleteUsuario(usuario3) )) {
        std::cout << "%TEST_FAILED% time=0 testname=testAutenticarUsuario (UsersDBTest) message=error message sample" << std::endl;
    }    
    
    if (usersDB.DeleteUsuario(nonRegisteredUser)) {
        std::cout << "%TEST_FAILED% time=0 testname=testAutenticarUsuario (UsersDBTest) message=error message sample" << std::endl;
    }
}

int main(int argc, char** argv) {
    std::cout << "%SUITE_STARTING% UsersDBTest" << std::endl;
    std::cout << "%SUITE_STARTED%" << std::endl;
    
    std::cout << "%TEST_STARTED% testUsersDB (UsersDBTest)" << std::endl;
    testUsersDB();
    std::cout << "%TEST_FINISHED% time=0 testUsersDB (UsersDBTest)" << std::endl;

    std::cout << "%TEST_STARTED% testAgregarUsuario (UsersDBTest)" << std::endl;
    testAgregarUsuario();
    std::cout << "%TEST_FINISHED% time=0 testAgregarUsuario (UsersDBTest)" << std::endl;

    std::cout << "%TEST_STARTED% testAutenticarUsuario (UsersDBTest)" << std::endl;
    testAutenticarUsuario();
    std::cout << "%TEST_FINISHED% time=0 testAutenticarUsuario (UsersDBTest)" << std::endl;    
    
    std::cout << "%TEST_STARTED% testDeleteUsuario (UsersDBTest)" << std::endl;
    testDeleteUsuario();
    std::cout << "%TEST_FINISHED% time=0 testDeleteUsuario (UsersDBTest)" << std::endl;    

    std::cout << "%SUITE_FINISHED% time=0" << std::endl;

    return (EXIT_SUCCESS);
}

